menuconfig BR2_PACKAGE_MESA3D
	bool "mesa3d"
	depends on BR2_INSTALL_LIBSTDCPP
	depends on !BR2_STATIC_LIBS
	depends on BR2_TOOLCHAIN_HAS_SYNC_1
	depends on BR2_TOOLCHAIN_HAS_THREADS_NPTL
	select BR2_PACKAGE_LIBDRM
	select BR2_PACKAGE_EXPAT
	select BR2_PACKAGE_HAS_LIBGL if BR2_PACKAGE_XORG7
	select BR2_PACKAGE_WAYLAND_PROTOCOLS if BR2_PACKAGE_WAYLAND
	select BR2_PACKAGE_XPROTO_DRI2PROTO if BR2_PACKAGE_XORG7
	select BR2_PACKAGE_XPROTO_GLPROTO if BR2_PACKAGE_XORG7
	select BR2_PACKAGE_XPROTO_XF86DRIPROTO if BR2_PACKAGE_XORG7
	select BR2_PACKAGE_XLIB_LIBX11 if BR2_PACKAGE_XORG7
	select BR2_PACKAGE_XLIB_LIBXEXT if BR2_PACKAGE_XORG7
	select BR2_PACKAGE_XLIB_LIBXDAMAGE if BR2_PACKAGE_XORG7
	select BR2_PACKAGE_XLIB_LIBXFIXES if BR2_PACKAGE_XORG7
	select BR2_PACKAGE_LIBXCB if BR2_PACKAGE_XORG7
	select BR2_PACKAGE_ZLIB
	help
	  Mesa 3D, an open-source implementation of the OpenGL
	  specification.

	  http://mesa3d.org

if BR2_PACKAGE_MESA3D

# Some Gallium driver needs libelf when built with LLVM support
config BR2_PACKAGE_MESA3D_NEEDS_ELFUTILS
	bool

config BR2_PACKAGE_MESA3D_LLVM
	bool "llvm support"
	depends on BR2_PACKAGE_LLVM_ARCH_SUPPORTS
	depends on BR2_HOST_GCC_AT_LEAST_4_8
	depends on BR2_TOOLCHAIN_GCC_AT_LEAST_4_8
	depends on BR2_TOOLCHAIN_HAS_THREADS
	depends on BR2_INSTALL_LIBSTDCPP
	depends on !BR2_TOOLCHAIN_HAS_GCC_BUG_64735 # std::shared_future
	depends on !BR2_STATIC_LIBS
	depends on BR2_USE_WCHAR # std::wstring
	select BR2_PACKAGE_LLVM

comment "llvm support needs a toolchain w/ wchar, threads, C++, gcc >= 4.8, host gcc >= 4.8, dynamic library"
	depends on BR2_PACKAGE_LLVM_ARCH_SUPPORTS
	depends on !BR2_TOOLCHAIN_HAS_THREADS || !BR2_INSTALL_LIBSTDCPP || \
		!BR2_HOST_GCC_AT_LEAST_4_8 || !BR2_TOOLCHAIN_GCC_AT_LEAST_4_8 \
		|| BR2_STATIC_LIBS || !BR2_USE_WCHAR

comment "llvm support needs a toolchain not affected by GCC bug 64735"
	depends on BR2_PACKAGE_LLVM_ARCH_SUPPORTS
	depends on BR2_TOOLCHAIN_HAS_GCC_BUG_64735

# inform the .mk file of gallium, dri or vulkan driver selection
config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	bool
	select BR2_PACKAGE_MESA3D_DRIVER

config BR2_PACKAGE_MESA3D_DRI_DRIVER
	bool
	select BR2_PACKAGE_MESA3D_DRIVER
	# xlib-libxshmfence needs sync_4, so we cannot select it if
	# BR2_TOOLCHAIN_HAS_SYNC_4 is false. xproto-presentproto
	# doesn't need sync_4, but it is only needed in conjunction
	# with xlib-libxshmfence and dri3proto to provide dri3
	# support, so we also only select it if sync_4 is available.
	select BR2_PACKAGE_XLIB_LIBXSHMFENCE if \
		(BR2_PACKAGE_XPROTO_DRI3PROTO && BR2_TOOLCHAIN_HAS_SYNC_4)
	select BR2_PACKAGE_XPROTO_PRESENTPROTO if \
		(BR2_PACKAGE_XPROTO_DRI3PROTO && BR2_TOOLCHAIN_HAS_SYNC_4)

config BR2_PACKAGE_MESA3D_VULKAN_DRIVER
	bool
	select BR2_PACKAGE_MESA3D_DRIVER

config BR2_PACKAGE_MESA3D_DRIVER
	bool

config BR2_PACKAGE_MESA3D_NEEDS_XA
	bool

comment "Gallium drivers"

config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_ETNAVIV
	bool "Gallium Etnaviv driver"
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	select BR2_PACKAGE_LIBDRM_ETNAVIV
	select BR2_PACKAGE_MESA3D_OPENGL_EGL
	help
	  Mesa driver for Vivante GPUs.

config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_NOUVEAU
	bool "Gallium nouveau driver"
	depends on BR2_i386 || BR2_x86_64
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	select BR2_PACKAGE_LIBDRM_NOUVEAU
	select BR2_PACKAGE_MESA3D_NEEDS_XA
	help
	  Supports all Nvidia GPUs.

config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R600
	bool "Gallium Radeon R600 driver"
	depends on BR2_i386 || BR2_x86_64
	depends on !BR2_PACKAGE_MESA3D_LLVM || \
		(BR2_PACKAGE_MESA3D_LLVM && (BR2_TOOLCHAIN_USES_UCLIBC || \
			BR2_TOOLCHAIN_USES_GLIBC)) # elfutils
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	select BR2_PACKAGE_LIBDRM_RADEON
	select BR2_PACKAGE_LLVM_AMDGPU if BR2_PACKAGE_MESA3D_LLVM
	select BR2_PACKAGE_ELFUTILS if BR2_PACKAGE_MESA3D_LLVM
	select BR2_PACKAGE_MESA3D_NEEDS_ELFUTILS if BR2_PACKAGE_MESA3D_LLVM
	select BR2_PACKAGE_MESA3D_NEEDS_XA
	help
	  Driver for ATI/AMD Radeon R600/R700/HD5000/HD6000 GPUs.

# R600 needs libelf when Mesa3D is built with LLVM support
# musl is not currently compatible with elfutils
comment "R600 driver needs a uClibc or glibc toolchain when llvm is enabled"
	depends on BR2_PACKAGE_MESA3D_LLVM
	depends on !(BR2_TOOLCHAIN_USES_UCLIBC || BR2_TOOLCHAIN_USES_GLIBC)

config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_RADEONSI
	bool "Gallium Radeon SI driver"
	depends on BR2_i386 || BR2_x86_64
	depends on BR2_PACKAGE_MESA3D_LLVM
	depends on BR2_TOOLCHAIN_USES_UCLIBC || BR2_TOOLCHAIN_USES_GLIBC # elfutils
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	select BR2_PACKAGE_LIBDRM_AMDGPU
	select BR2_PACKAGE_LIBDRM_RADEON
	select BR2_PACKAGE_LLVM_AMDGPU
	select BR2_PACKAGE_ELFUTILS
	select BR2_PACKAGE_MESA3D_NEEDS_ELFUTILS
	select BR2_PACKAGE_MESA3D_NEEDS_XA
	help
	  Driver for ATI/AMD Radeon HD7000/HD8000/Rx200 GPUs.

# Radeon SI needs libelf
# musl is not currently compatible with elfutils
comment "Radeon SI driver needs a uClibc or glibc toolchain"
	depends on BR2_PACKAGE_MESA3D_LLVM
	depends on !(BR2_TOOLCHAIN_USES_UCLIBC || BR2_TOOLCHAIN_USES_GLIBC)

config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_SVGA
	bool "Gallium vmware svga driver"
	depends on BR2_i386 || BR2_x86_64
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	select BR2_PACKAGE_LIBDRM_VMWGFX
	select BR2_PACKAGE_MESA3D_NEEDS_XA
	help
	  This is a virtual GPU driver for VMWare virtual machines.

config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_SWRAST
	bool "Gallium swrast driver"
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	help
	  This is a software opengl implementation using the Gallium3D
	  infrastructure.

config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_VC4
	bool "Gallium vc4 driver"
	depends on BR2_ARM_CPU_HAS_NEON || BR2_aarch64
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	select BR2_PACKAGE_LIBDRM_VC4
	select BR2_PACKAGE_MESA3D_NEEDS_XA
	select BR2_PACKAGE_MESA3D_OPENGL_EGL
	help
	  Driver for Broadcom VC4 (rpi2/3) GPUs.
	  It requires a vanilla 4.5+ kernel with drm vc4 (open) support.

config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_VIRGL
	bool "Gallium virgl driver"
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	select BR2_PACKAGE_MESA3D_OPENGL_EGL
	help
	  virgl is the 3D acceleration backend for the virtio-gpu
	  shipping with qemu.

comment "DRI drivers"

config BR2_PACKAGE_MESA3D_DRI_DRIVER_SWRAST
	bool "DRI swrast driver"
	select BR2_PACKAGE_MESA3D_DRI_DRIVER
	help
	  This is a software opengl implementation using the DRI
	  infrastructure.

config BR2_PACKAGE_MESA3D_DRI_DRIVER_I915
	bool "DRI i915 driver"
	depends on BR2_i386 || BR2_x86_64
	select BR2_PACKAGE_MESA3D_DRI_DRIVER
	select BR2_PACKAGE_LIBDRM_INTEL
	help
	  Support for i915-based Intel GPUs.

config BR2_PACKAGE_MESA3D_DRI_DRIVER_I965
	bool "DRI i965 driver"
	depends on BR2_i386 || BR2_x86_64
	select BR2_PACKAGE_MESA3D_DRI_DRIVER
	select BR2_PACKAGE_LIBDRM_INTEL
	help
	  Support for i965-based Intel GPUs.

config BR2_PACKAGE_MESA3D_DRI_DRIVER_NOUVEAU
	bool "DRI nouveau driver"
	select BR2_PACKAGE_MESA3D_DRI_DRIVER
	select BR2_PACKAGE_LIBDRM_NOUVEAU
	help
	  Support for Nvidia-based GPUs.

config BR2_PACKAGE_MESA3D_DRI_DRIVER_RADEON
	bool "DRI radeon driver"
	select BR2_PACKAGE_MESA3D_DRI_DRIVER
	select BR2_PACKAGE_LIBDRM_RADEON
	help
	  Legacy Radeon driver for R100 series GPUs.

comment "Vulkan drivers"

config BR2_PACKAGE_MESA3D_VULKAN_DRIVER_INTEL
	bool "Vulkan Intel driver"
	depends on BR2_i386 || BR2_x86_64
	depends on BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_18 # memfd.h
	depends on BR2_TOOLCHAIN_USES_GLIBC # ifunc, static_assert
	depends on BR2_PACKAGE_XORG7 # xproto_dri3proto
	select BR2_PACKAGE_MESA3D_VULKAN_DRIVER
	select BR2_PACKAGE_XPROTO_DRI3PROTO
	help
	  Vulkan driver for Intel hardware from Ivy Bridge onward.

comment "intel vulkan depends on X.org and needs a glibc toolchain w/ headers >= 3.18"
	depends on BR2_i386 || BR2_x86_64
	depends on !BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_18 || \
		!BR2_TOOLCHAIN_USES_GLIBC || !BR2_PACKAGE_XORG7

comment "Off-screen Rendering"

config BR2_PACKAGE_MESA3D_OSMESA
	bool "OSMesa library"
	help
	  The OSMesa API provides functions for making off-screen
	  renderings.

if BR2_PACKAGE_MESA3D_DRIVER

comment "Additional API Support"

config BR2_PACKAGE_MESA3D_OPENGL_EGL
	bool "OpenGL EGL"
	select BR2_PACKAGE_HAS_LIBEGL
	select BR2_PACKAGE_HAS_LIBEGL_WAYLAND
	help
	  Use the Khronos EGL APIs. EGL is a window manager for OpenGL
	  applications similar to GLX, for X, and WGL, for Windows.

config BR2_PACKAGE_MESA3D_OPENGL_ES
	bool "OpenGL ES"
	select BR2_PACKAGE_HAS_LIBGLES
	help
	  Use the Khronos OpenGL ES APIs. This is commonly used on
	  embedded systems and represents a subset of the OpenGL API.

config BR2_PACKAGE_MESA3D_OPENGL_TEXTURE_FLOAT
	bool "OpenGL texture float (patented format)"
	help
	  GL_ARB_texture_float is required to enable GLX core profile
	  (OpenGL3.x) otherwise the compat profile is used
	  (OpenGL2.1).

	  The source code to implement ARB_texture_float extension is
	  included and can be toggled on at compile time, for those
	  who purchased a license from SGI, or are in a country where
	  the patent does not apply, etc.

	  Please consult docs/patents.txt with your lawyer before
	  building Mesa.

	  Also, note that this option doesn't affect all drivers. Some
	  drivers have support for texture float enabled
	  unconditionally.

	  If unsure, say N.

	  http://www.google.com/patents/about?id=mIIOAAAAEBAJ&dq=6650327

endif # BR2_PACKAGE_MESA3D_DRIVER

config BR2_PACKAGE_PROVIDES_LIBGL
	default "mesa3d" if BR2_PACKAGE_XORG7

config BR2_PACKAGE_PROVIDES_LIBEGL
	default "mesa3d" if BR2_PACKAGE_MESA3D_OPENGL_EGL

config BR2_PACKAGE_PROVIDES_LIBGLES
	default "mesa3d" if BR2_PACKAGE_MESA3D_OPENGL_ES

endif # BR2_PACKAGE_MESA3D

comment "mesa3d needs a toolchain w/ C++, NPTL, dynamic library"
	depends on !BR2_INSTALL_LIBSTDCPP || !BR2_TOOLCHAIN_HAS_THREADS_NPTL || \
		BR2_STATIC_LIBS
	depends on BR2_TOOLCHAIN_HAS_SYNC_1
